#ifndef GY_TAPECIRCULAR_H
#define GY_TAPECIRCULAR_H

#include "GY_ContainerTransform.h"
#include "GY_ControlLibrary_global.h"
#include "GY_ClippingToolContainer.h"
#include "GY_SimpleGroup.h"

class GY_CONTROLLIBRARY_EXPORT GY_TapeCircular : public GY_ContainerTransform
{
    Q_OBJECT
public:
    explicit Q_INVOKABLE GY_TapeCircular(const QString &guid,QGraphicsItem *parent = nullptr);
    ~GY_TapeCircular();
    /**
     * @brief addItem 组中添加图元
     * @param item
     * @return
     */
    bool addItem(GY_Object *pItem) override;
    /**
     * @brief removItem 移除组中的图元
     * @param guid 图元的guid
     * @return 是否移除成功
     */
    bool removItem(const QString &guid) override;
    /**
     * @brief removItem 移除图元
     * @param pItem 图元指针
     * @return 是否移除成功
     */
    bool removItem(const GY_Object *pItem) override;
    //!继承基类重写
    GY_Object * copyItem(const QString &guid = QString()) override;

public slots:
    /**
     * @brief updateCopyItemProperty 更新复制属性，与原版保持一致
     * @param pObject 更新属性的对象
     * @param propertyName 属性名称
     * @param propertyValue 属性值
     * @param type 属性类型
     */
    void updateCopyItemProperty(const GY_Object* pObject,const QString &propertyName,const QVariant &propertyValue,const PropertyType& type);

private:
    /**
     * @brief m_pRect 剪切矩形大小
     */
    QGraphicsRectItem *m_pRect;
    /**
     * @brief m_pTransFormGroupClipping 控制剪切容器
     */
    GY_ClippingToolContainer* m_pClippingToolContainer;
    /**
     * @brief m_pSimpleGroup1 移动组
     */
    GY_SimpleGroup* m_pSimpleGroup;
    /**
     * @brief m_copyItem 复制控件
     */
    QMap<GY_Object*,GY_Object*> m_copyItemMap;
    /**
     * @brief m_orderChildrensMap 原版子类控件
     */
    QVector<GY_Object *> m_orderChildrensMap;
    /**
     * @brief m_ZValue 添加图形层级
     */
    int m_ZValue = 0;

private:
    /**
     * @brief initializationPropertyInfo 初始化属性信息
     */
    void initializationPropertyInfo();
    /**
     * @brief UpdateDraw 更新绘制
     */
    void updateDraw();
    /**
     * @brief updatePosition 更新位置
     * @param name 属性名称
     * @param value 位置
     * @return 是否更新成功
     */
    bool updatePosition(const QString &name, const QVariant &value);
    /**
     * @brief updateIsVisible 更新显示全部项目
     * @param name 属性名称
     * @param value bool值
     * @return 是否更新成功
     */
    bool updateIsVisible(const QString &name, const QVariant &value);
    /**
     * @brief updateValue 循环值
     * @param name 属性名称
     * @param value value值
     * @return 是否更新成功
     */
    bool updateValue(const QString &name, const QVariant &value);
    /**
     * @brief updateValuePerRevolution 循环最大值
     * @param name 属性名称
     * @param value valuePerRevolution值
     * @return 是否更新成功
     */
    bool updateValuePerRevolution(const QString &name, const QVariant &value);
    /**
     * @brief updateDisplayAreaLeft 更新左边距值
     * @param name 属性名称
     * @param value 左边距值
     * @return 是否更新成功
     */
    bool updateDisplayAreaLeft(const QString &name, const QVariant &value);
    /**
     * @brief updateDisplayAreaBottom 更新下边距值
     * @param name 属性名称
     * @param value 下边距值
     * @return 是否更新成功
     */
    bool updateDisplayAreaBottom(const QString &name, const QVariant &value);
    /**
     * @brief updateDisplayAreaRight 更新右边距值
     * @param name 属性名称
     * @param value 右边距值
     * @return 是否更新成功
     */
    bool updateDisplayAreaRight(const QString &name, const QVariant &value);
    /**
     * @brief updateDisplayAreaTop 更新上边距值
     * @param name 属性名称
     * @param value 上边距值
     * @return 是否更新成功
     */
    bool updateDisplayAreaTop(const QString &name, const QVariant &value);
    /**
     * @brief updatePoint 更新点结束位置
     * @param name 属性名称
     * @param value 点位置
     * @return 是否更新成功
     */
    bool updatePoint(const QString &name, const QVariant &value);
    /**
     * @brief updateMotion 更新结束点位置
     * @param name 属性名称
     * @param value 点位置
     * @return 是否更新成功
     */
    bool updateMotion(const QString &name, const QVariant &value);
    /**
     * @brief updateLeftPoint 更新左边距点
     * @param name 属性名称
     * @param value 左边距点
     * @return 是否更新成功
     */
    bool updateLeftPoint(const QString &name, const QVariant &value);
    /**
     * @brief updateBottomPoint 更新下边距点
     * @param name 属性名称
     * @param value 下边距点
     * @return 是否更新成功
     */
    bool updateBottomPoint(const QString &name, const QVariant &value);
    /**
     * @brief updateRightPoint 更新右边距点
     * @param name 属性名称
     * @param value 右边距点
     * @return 是否更新成功
     */
    bool updateRightPoint(const QString &name, const QVariant &value);
    /**
     * @brief updateTopPoint 更新上边距点
     * @param name 属性名称
     * @param value 上边距点
     * @return 是否更新成功
     */
    bool updateTopPoint(const QString &, const QVariant &value);

};

#endif // GY_TAPECIRCULAR_H
